home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 November: Tool Chest / Dev.CD Nov 94.toast / New System Software Extensions / OpenDoc A6 / OpenDoc Parts Framework / OPF / Found / FWDebug / Sources / FWWTrace.cpp < prev   
Encoding:
C/C++ Source or Header  |  1994-04-21  |  2.3 KB  |  101 lines  |  [TEXT/MPS ]

  1. #if defined(FW_DEBUG) && defined(FW_BUILD_WIN) && !defined(FW_BUILD_WIN32S)
  2. // This entire file is for debugging Windows applications only
  3. //========================================================================================
  4. //
  5. //    File:                FWWTrace.cpp
  6. //    Release Version:    $ 1.0d1 $
  7. //
  8. //    Creation Date:        3/28/94
  9. //
  10. //    Copyright:    © 1994 by Apple Computer, Inc., all rights reserved.
  11. //
  12. //========================================================================================
  13.  
  14. #ifndef _INC_WINDOWS
  15. #include <Windows.h>
  16. #endif
  17.  
  18. #ifndef  _INC_TOOLHELP
  19. #include <toolhelp.h>
  20. #endif
  21.  
  22. #ifndef FWWTRACE_H
  23. #include "FWWTrace.h"
  24. #endif
  25.  
  26. #ifdef FW_BUILD_DOS
  27. #include <string.h>
  28. #define lstrcpy strcpy
  29. #endif
  30.  
  31. //----------------------------------------------------------------------------------------
  32. // FW_PrivWinGetCallerInfo
  33. //----------------------------------------------------------------------------------------
  34. void FAR PASCAL FW_PrivWinGetCallerInfo(HANDLE* phModule,
  35.                                  char* zModule,
  36.                                  WORD* pwSegment,
  37.                                  WORD* pwOffset,
  38.                                  unsigned n_TraceDepth)
  39. {
  40. #ifndef FW_BUILD_DOS
  41.     STACKTRACEENTRY StackEntry;
  42.     
  43.     WORD wSS, wCS, wIP, wBP;
  44.     
  45.     asm    {
  46.         mov wSS, SS
  47.         mov wCS, CS
  48.     };
  49.     
  50.     __emit__(0xE8, 0x00, 0x00);        // call near $+0, equiv. to push IP
  51.  
  52.     asm    {
  53.         pop wIP
  54.         mov wBP, BP
  55.     };
  56.  
  57.     StackEntry.dwSize = sizeof(STACKTRACEENTRY);
  58.     if (!StackTraceCSIPFirst(&StackEntry, wSS, wCS, wIP, wBP))
  59.     {
  60.         *phModule = 0;
  61.         *pwSegment = 0;
  62.         *pwOffset = 0;
  63.  
  64.         if (zModule != NULL)
  65.             lstrcpy(zModule, "? fail ?");
  66.  
  67.         return;
  68.     }
  69.  
  70.     while(n_TraceDepth-- > 0)
  71.         StackTraceNext(&StackEntry);
  72.  
  73.     *phModule = StackEntry.hModule;
  74.     *pwSegment = StackEntry.wSegment;
  75.     *pwOffset = StackEntry.wIP;
  76.  
  77.     if (zModule != NULL)
  78.         FW_PrivWinGetModuleName(StackEntry.hModule, zModule);
  79. #endif
  80. }
  81.  
  82. //----------------------------------------------------------------------------------------
  83. // FW_PrivWinGetModuleName
  84. //----------------------------------------------------------------------------------------
  85. void FAR PASCAL FW_PrivWinGetModuleName(HANDLE hModule, char* zModule)
  86. {
  87.     MODULEENTRY ModuleEntry;
  88.     ModuleEntry.dwSize = sizeof(MODULEENTRY);
  89.  
  90. #ifdef FW_BUILD_DOS
  91.     lstrcpy(zModule, "? fail ?");
  92. #else
  93.     if(ModuleFindHandle(&ModuleEntry, hModule))
  94.         lstrcpy(zModule, ModuleEntry.szModule);
  95.     else
  96.         lstrcpy(zModule, "? fail ?");
  97. #endif
  98. }
  99.  
  100. #endif
  101.